package servidor;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import clasesBasicas.Usuario;

public class GestorBDUsuarios implements IGestorBDUsuarios{
	Connection conexionBD;

	public GestorBDUsuarios() {
		super();
		try {
			Class.forName("org.sqlite.JDBC");
		} catch (ClassNotFoundException e1) {
			System.out.println("No se encontro clase.");
			e1.printStackTrace();
		}
		try {
			//conexionBD=DriverManager.getConnection("jdbc:sqlite:bd/redes.sql");
			conexionBD=DriverManager.getConnection("jdbc:sqlite:bd/redesBD.db");
		} catch (SQLException e) {
			System.out.println("[BD]   Fallo de BD.");
			e.printStackTrace();
		}
	}

	@Override
	public ArrayList<Usuario> obtenerUsuarios() {
		//Obtenemos de la BD la combinación y creamos los usuarios metiendolos en el hashmap
//		HashMap<String, Usuario> listaUser= new HashMap<String, Usuario>();
		ArrayList<Usuario> listaUser = new ArrayList<Usuario>();
		Statement s=null;
		ResultSet resultSet = null;
		try {
			s=conexionBD.createStatement();
			String comprobarUs = " SELECT * FROM Usuarios";
			resultSet = s.executeQuery(comprobarUs);
			while(resultSet.next())
			{
				Usuario temp= new Usuario(resultSet.getInt("id"), resultSet.getString("nombre"), resultSet.getString("apellido"), resultSet.getString("usuario"), resultSet.getString("contrasena"));
				listaUser.add(temp);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("[BD]   ERROR al obtener usuarios.");
			//e.printStackTrace();
		}
		cierres(s, resultSet);
		
		return listaUser;
	}
	
	
	@Override
	public ArrayList<Usuario> obtenerUsuariosConectados() {
		//Obtenemos de la BD la combinación y creamos los usuarios metiendolos en el hashmap
		ArrayList<Usuario> listaUser= new ArrayList<Usuario>();
		Statement s=null;
		ResultSet resultSet = null;
		try {
			s = conexionBD.createStatement();
			String comprobarUs = " SELECT * FROM Usuarios WHERE conectado='ON'";
			resultSet = s.executeQuery(comprobarUs);
			while(resultSet.next())
			{
				Usuario temp= new Usuario(resultSet.getInt("id"), resultSet.getString("nombre"), resultSet.getString("apellido"), resultSet.getString("usuario"), resultSet.getString("contrasena"));
				listaUser.add(temp);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("[BD]   ERROR al obtener usuarios.");
			//e.printStackTrace();
		}
		cierres(s, resultSet);
		
		return listaUser;
	}

	@Override
	public int comprobarUsuario(String usuario) {
		//Compruebo si existe ese usuario en la BD
		boolean resultado=false;
		Statement s=null;
		ResultSet resultSet = null;
		try {
			s=conexionBD.createStatement();
			String comprobarUs = " SELECT * FROM Usuarios WHERE usuario='"+usuario+"' ";
			resultSet = s.executeQuery(comprobarUs);
			resultado=resultSet.next();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("[BD]   ERROR al comprobar nombre usuario.");
			//e.printStackTrace();
		}
		cierres(s, resultSet);
		if(resultado){
			return 1;
		}
		else {
			return 0;
		}		
	}

	@Override
	public int comprobarUsuarioConPass(Usuario u) {
		//Comprueba la combinación usuario/pass (1= correcta, 0= incorrecta)
		
		boolean resultado=false;
		Statement s=null;
		ResultSet resultSet = null;
		String contrasena="";
		try {
			s=conexionBD.createStatement();
			String comprobarUs = " SELECT contrasena FROM Usuarios WHERE usuario='"+u.getUserName()+"' ";
			resultSet = s.executeQuery(comprobarUs);
			contrasena=resultSet.getString("contrasena");
			System.out.println(contrasena);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("[BD]   ERROR al comprobar usuario con su pass.");
			//e.printStackTrace();
		}
		if(contrasena.equals(u.getPassword())){
			cierres(s, resultSet);
			//Si es correcta la contraseña, lo ponemos a conectado!
			System.out.println("[SERVER]  Conectado");
			Statement temp=null;
			String sqlStatementString=null;
			try {
				temp=conexionBD.createStatement();
				System.out.println("Usuario:"+u.getUserName()+" pass:"+u.getPassword());
				sqlStatementString="UPDATE usuarios SET conectado='ON' WHERE usuario='"+u.getUserName()+"'";  	

				temp.executeUpdate(sqlStatementString);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("[BD]   ERROR al actualizar el usuario a conectado.");
			}
			cierres(temp, null);
			return 1;
			
		}
		else {
			return 0;
		}	
	}

	@Override
	public void borrarUsuario(String userName) {
		// Borra un usuario con el userName
		Statement s=null;
		String sentencia=null;
		try {
			s=conexionBD.createStatement();
			sentencia="DELETE FROM usuarios WHERE usuario = '"+userName+"'";  	
			s.executeUpdate(sentencia);
		} catch (SQLException e) {
			System.out.println("[BD]   ERROR al eliminar usuario.");
			//e.printStackTrace();
		}
		cierres(s, null);
		
		
	}

	@Override
	public void anadirUsuario(Usuario u) {
		// Anadir usuario a la BD
		Statement s=null;
		String sentencia=null;
		try {
			s=conexionBD.createStatement();
			sentencia="INSERT INTO usuarios (nombre, apellido, usuario, contrasena) VALUES ('"+u.getNombre()+"','"+u.getApellido()+"', '"+u.getUserName()+"', '"+u.getPassword()+"')";  	
			s.executeUpdate(sentencia);
		} catch (SQLException e) {
			System.out.println("[BD]   ERROR al crear usuario.");
			//e.printStackTrace();
		}
		cierres(s, null);
		
	}

	
	@Override
	public Usuario buscarUsuario(String userName) {
		//Busca un usuario por su nombre de usuario
		Statement s=null;
		ResultSet resultSet = null;
		Usuario temp=null;
		try {
			s=conexionBD.createStatement();
			String comprobarUs = " SELECT * FROM usuarios WHERE usuario='"+userName+"' ";
			resultSet = s.executeQuery(comprobarUs);
			temp= new Usuario(resultSet.getInt("id"), resultSet.getString("nombre"), resultSet.getString("apellido"), resultSet.getString("usuario"), resultSet.getString("contrasena"));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("[BD]   ERROR al buscar el usuario.");
			//e.printStackTrace();
		}	
		cierres(s, resultSet);
		return temp;
	}

	@Override
	public void desconectarUsuario(String userName) {
		// TODO Auto-generated method stub
		
		Statement temp=null;
		String sqlStatementString=null;
		try {
			temp=conexionBD.createStatement();
			sqlStatementString="UPDATE usuarios SET conectado='OFF' WHERE usuario='"+userName+"'";  	
			temp.executeUpdate(sqlStatementString);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("[BD]   ERROR al actualizar el usuario a desconectado.");
		}	
		cierres(temp, null);
	}
	
	public Connection getConexion()
	{
		return conexionBD;
	}
	
	public void cierres(Statement s, ResultSet r)
	{
		try {
			if(s!=null)
			{
				s.close();
			}
			
			if(r!=null)
			{
				r.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	@Override
	public void editarUsuario(String idNuevo, String idViejo) {
		// TODO Auto-generated method stub
		Statement temp = null;
		String sqlStatementString=null;
		try {
			temp=conexionBD.createStatement();
			sqlStatementString="UPDATE usuarios SET usuario='"+ idNuevo +"' WHERE usuario='"+idViejo+"'";  	
			temp.executeUpdate(sqlStatementString);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			
			System.out.println("[BD]   ERROR al actualizar el id del usuario.");
		}	
		
		cierres(temp, null);
	}

	@Override
	public boolean existeUsuario(String userName) {
		Statement s=null;
		ResultSet resultSet = null;
		boolean existe = false;
		try {
			s=conexionBD.createStatement();
			String comprobarUs = " SELECT * FROM usuarios WHERE usuario='"+userName+"' ";
			resultSet = s.executeQuery(comprobarUs);
			if(resultSet.next()){
				existe = true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("[BD]   ERROR el usuario ya existe.");
			//e.printStackTrace();
		}	
		cierres(s, resultSet);
		// TODO Auto-generated method stub
		return existe;
	}

	@Override
	public void editarContrasena(String contrasena, String IdUsuario) {
		// TODO Auto-generated method stub
		// TODO Auto-generated method stub
		Statement temp = null;
		String sqlStatementString=null;
		try {
			temp=conexionBD.createStatement();
			sqlStatementString="UPDATE usuarios SET contrasena='"+ contrasena +"' WHERE usuario='"+IdUsuario+"'";  	
			temp.executeUpdate(sqlStatementString);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			
			System.out.println("[BD]   ERROR al actualizar la contrasena al usuario.");
		}	

		cierres(temp, null);

	}

}
